/* Copyright 2013 University of Padua, Italy
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package it.dei.unipd.healthservice.database;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import it.dei.unipd.healthservice.resource.*;

/**
 * Visualizza i fornitori
 * 
 * @author Nicola Salmaso
 * @version 1.00
 */
public class ViewRecapitiDatabase {
	/**
	 * Query di ricerca recapito nel database
	 */
	private static final String STATEMENT = "SELECT * " +
			"FROM recapito INNER JOIN ordine " +
			"ON recapito.idrecapito = ordine.idrecapito " +
			"WHERE ordine.mail =?;";
			

	private static final String GET_ID_STATEMENT = "SELECT idrecapito " +
			"FROM recapito " +
			"WHERE ragione_sociale=? and stato=? and provincia=? and citta=? and indirizzo=? and cap=? " +
			"ORDER BY idrecapito limit 1 ";

	/**
	 * Connessione al database
	 */
	private final Connection con;
	/**
	 * email dell'utente di cui si vogliono conoscere i recapiti
	 */
	private final String mail, ragSociale, stato, provincia, indirizzo, cap, citta;
	/**
	 * Risultati della ricerca
	 */
	private final ArrayList<Recapito> recapiti;

	/**
	 * Ricerca tutti i recapiti di un dato cliente
	 * 
	 * @param con
	 * connessione al database.
	 * @param mail
	 * email del cliente
	 */
	public ViewRecapitiDatabase(Connection con,String mail) {
		this(con,mail,"","","","","","");
	}
	/**
	 * 
	 * @param con
	 * connessione al database.
	 * @param mail
	 * email del cliente
	 * @param ragSociale
	 * ragione sociale del recapito da cercare
	 * @param stato
	 * stato del recapito da cercare
	 * @param provincia
	 * provincia del recapito da cercare
	 * @param citta
	 * citta del recapito da cercare
	 * @param indirizzo
	 * indirizzo del recapito da cercare
	 * @param cap
	 * cap del recapito da cercare
	 */
	public ViewRecapitiDatabase(Connection con,String mail,String ragSociale,String stato,
								String provincia,String citta,String indirizzo,String cap) {
		this.con = con;
		recapiti = new ArrayList<Recapito>();
		this.mail=mail;
		this.ragSociale=ragSociale;
		this.stato=stato;
		this.provincia=provincia;
		this.citta=citta;
		this.indirizzo=indirizzo;
		this.cap=cap;
	}
	/**
	 * Cerca i recapiti
	 * 
	 * @return la lista di recapiti del cliente
	 *             in caso di problemi nell'accesso al database.
	 */
	public ArrayList<Recapito> search() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;
		try {
			pstmt = con.prepareStatement(STATEMENT);
			pstmt.setString(1, mail);
			int i = 0;
			rs = pstmt.executeQuery();
			while (rs.next())
				try{
					
					Recapito recapito = new Recapito(rs.getInt("idrecapito"), rs.getString("ragione_sociale"),
							rs.getString("stato"),rs.getString("provincia"),
							rs.getString("citta"), rs.getString("indirizzo"), rs.getString("cap"));
					
					
					recapiti.add(recapito) ;
				}catch (IllegalArgumentException e){}
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
		return recapiti;
	}
	/**
	 * Restituisce l'id recapito associato all'indirizzo e all'email forniti
	 * @return idRecapito
	 * l'id del recapito cercato, -1 se non c'è alcun riscontro
	 * @throws SQLException
	 */
	public Integer getIdRecapito() throws SQLException {

		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			pstmt = con.prepareStatement(GET_ID_STATEMENT);
			
			pstmt.setString(1, ragSociale);
			pstmt.setString(2, stato);
			pstmt.setString(3, provincia);
			pstmt.setString(4, citta);
			pstmt.setString(5, indirizzo);
			pstmt.setString(6, cap);
			
			
			rs = pstmt.executeQuery();
			if(rs.next()) return rs.getInt("idrecapito");
		}
		finally {
			if (rs != null)
				rs.close();
			if (pstmt != null)
				pstmt.close();
			con.close();
		}
		return -1;
	}
}